-- *****************************************************************************
-- *                                                    *     _       _        *
-- *  AdaDecoupe                                        *    / \   __| | __ _  *
-- *  http://code.google.com/p/adadecoupe/              *   / _ \ / _` |/ _` | *
-- *  Radim Badsi & Célia Biguzzi - IG3                 *  / ___ \ (_| | (_| | *
-- *  Polytech'Montpellier                              * /_/   \_\__,_|\__,_| *
-- *                                                    *                      *
-- *****************************************************************************
-- *                                                                           *
-- * commandes.ads  -  Commandes                                               *
-- * Représentation d'une commande. Une seule pièce peut être associée à       *
-- * chaque commande.                                                          *
-- *                                                                           *
-- *****************************************************************************

with Ansi; use Ansi;

with Util; use Util;
with Pieces; use Pieces;
with Liste_Categories; with Categories;

package Commandes is

    type Commande is private;
    subtype Etat_Commande is Character; 
    -- Possible A | c | g | p | S
    -- A : En attente
    -- c : Mauvaise catégorie
    -- g : Hauteur ou Largeur trop grande
    -- p : Hauteur ou Largeur trop petite
    -- S : Satisfaite

    function Get_Piece_Assoc (Comm : Commande) return Ptr_Piece;
    function Get_Piece_Assoc (Comm : Commande) return Piece;
    
    function Get_Id (Comm : Commande) return Natural;
    function Get_Client (Comm : Commande) return String;

	function Get_Etat (Comm : Commande) return Etat_Commande;
	procedure Set_Etat (Comm : in out Commande; Etat : in Etat_Commande);

    
    function Creer (Id : Natural;
                    Client : String;
                    Cat : Categorie_Verre;
                    Taille : Dimension) return Commande;
    -- Retourne une nouvelle commande
                    
    function Creer (Id : Natural; Client : String; Etat : Etat_Commande) return Commande;
    
                    
    function Verifier (Verre : Categorie_Verre; Largeur : Natural; Hauteur : Natural) return Etat_Commande;
    -- Retourne 1 si la commande presente une erreur
    
    function Copie (Src : Commande) return Commande;
    
    function En_Attente (Comm : Commande) return Boolean;
    -- Test pour savoir si la commande est en attente
    function Erronee (Comm : Commande) return Boolean;
    -- Test pour savoir si la commande est erronée
    
    function ToString (Comm : Commande) return String;
                                
private
    type Commande is
    record
        -- Numero de la commande
        Id: Natural;
        
        -- Client
        Client: String(1..4);
        
        -- Piece associee a la commande
        -- Justification du type : Pour simplifier le traitement algorithmique, 
        -- nous supposons qu'une commande peut n'avoir aucune piece associee
        -- (cas des commandes erronees ou la piece n'est jamais cree puisque
        -- invalide). Nous avons donc besoin de la valeur "Null".
        Piece_Assoc: Ptr_Piece;
        
        -- Etat de la commande
        Etat: Etat_Commande;
    end record;
    
end Commandes;